/**
 * <<动态资源管理>>
 * 
 * [不需要管理部分]
 * 静态资源(拖挂到预制体上的资源)
 * cc.assetManager.loadRemote(可以自动释放)
 * 
 * [需要管理的部分]
 * cc.resources.load
 * cc.resources.loadDir
 * 
 * cc.assetManager.releaseAsset 强制释放资源,不会进行引用计数检验 所以使用需要确保别的地方没有正在用
*/

/**需要在creator.d.ts Component中声明这两个函数
 * addAutoReleaseAsset(_asset: cc.Asset):void;
 * addAutoReleaseAssets(_assets: cc.Asset[]):void;
 */

cc.Component.prototype.addAutoReleaseAsset = function (_asset: cc.Asset) {
    let tempAuto = this.node.getComponent(AutoReleaseAssets);
    if (!cc.isValid(tempAuto)) {
        tempAuto = this.node.addComponent(AutoReleaseAssets);
        tempAuto.addAutoReleaseAsset(_asset);
    }
}

cc.Component.prototype.addAutoReleaseAssets = function (_assets: cc.Asset[]) {
    let tempAuto = this.node.getComponent(AutoReleaseAssets);
    if (!cc.isValid(tempAuto)) {
        tempAuto = this.node.addComponent(AutoReleaseAssets);
    }
    for (const _asset of _assets) {
        tempAuto.addAutoReleaseAsset(_asset);
    }
}

const { ccclass, menu, disallowMultiple } = cc._decorator;

@ccclass
@menu('资源管理/AutoReleaseAssets')
@disallowMultiple
export default class AutoReleaseAssets extends cc.Component {
    private dynamicsAssets: cc.Asset[] = [];

    public addAutoReleaseAsset(_asset: cc.Asset) {
        if (cc.isValid(_asset)) {
            _asset.addRef();
            this.dynamicsAssets.push(_asset);
        }
    }
    //当前动态资源长度=="+this.dynamicsAssets.length
    onDestroy(): void {
        //继承cc.Component 拥有生命周期 如果Node销毁就会顺带销毁这里
        let len = this.dynamicsAssets.length
        for (let index = 0; index < len; index++) {
            if (cc.isValid(this.dynamicsAssets[index])) {
                this.dynamicsAssets[index].decRef();
            }
        }
        this.dynamicsAssets = [];
    }
}